package semisupervise;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.StringTokenizer;

import utils.Review;

/**
 * Un classifieur pour apprentissage semi-supervise
 * ne sachant que construire son dictionnaire. Dérivez cette
 * classe pour faire des classifieurs
 *
 */
public class ClassifieurSemi {
	protected ArrayList<String> dictionnaire;
	
	/**
	 * Construit un dictionnaire à partir de reviews
	 * 
	 * @param reviews
	 *            La liste des reviews du corpus
	 */
	protected void construireDictionnaire(ArrayList<Review> reviews) {
		HashMap<String, Integer> comptes = new HashMap<String, Integer>();
		StringTokenizer tokenizer;
		String token;
		int totalMots = 0;

		dictionnaire = new ArrayList<String>();
		
		// Pour chaque review
		for (Review review : reviews) {
			// On tokenize son texte selon les espaces
			tokenizer = new StringTokenizer(review.getTexte(), " ");
			// Pour chaque mot
			while (tokenizer.hasMoreTokens()) {
				token = tokenizer.nextToken().toLowerCase();
				// S'il y a plus d'un caractere (les autres sont
				// des signes de ponctuation)
				if (token.length() > 1) {
					// S'il n'est pas dans la hashmap
					if (!comptes.containsKey(token)) {
						// On l'ajoute avec compte 1
						comptes.put(token, 1);
					}
					// Si on l'a déjà vu
					else {
						// On le remet avec un compte en plus
						comptes.put(token, comptes.get(token) + 1);
					}
					++totalMots;
				} // pas ponctuation
			} // tous les tokens
		} // toutes les reviews
//		 System.out.println(comptes.size() + " mots representes " + totalMots
//		 + " fois");
		 
		// Au dela de ce nombre, le mot est trop fréquent
		double seuilMax = Math.floor(((double) 2 * totalMots / 100));
//		 System.out.println("S'il est présent plus de " + seuilMax +
//		 " fois, le mot sera retiré");
		// Pour chaque mot
		for (String mot : comptes.keySet()) {
			// Si il ne dépasse pas le seuil
			if (comptes.get(mot) <= seuilMax) {
				// On l'ajoute au dico
				dictionnaire.add(mot);
			}
		}
		
//		System.out.println(dictionnaire.size() +
//		 " mots restants dans le dictionnaire");
	}
}
